package com.mentalhealth.diary.utils;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * 密码加密工具类
 */
public class PasswordUtils {

    private static final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();

    /**
     * 加密密码
     * @param rawPassword 原始密码
     * @return 加密后的密码
     */
    public static String encode(String rawPassword) {
        return encoder.encode(rawPassword);
    }

    /**
     * 验证密码
     * @param rawPassword 原始密码
     * @param encodedPassword 加密后的密码
     * @return 是否匹配
     */
    public static boolean matches(String rawPassword, String encodedPassword) {
        return encoder.matches(rawPassword, encodedPassword);
    }

    /**
     * 验证密码强度
     * @param password 密码
     * @return 强度等级 (0-弱, 1-中, 2-强)
     */
    public static int checkPasswordStrength(String password) {
        if (password == null || password.length() < 6) {
            return 0;
        }

        int strength = 0;
        // 检查长度
        if (password.length() >= 8) strength++;
        // 检查是否包含数字
        if (password.matches(".*\\d.*")) strength++;
        // 检查是否包含字母
        if (password.matches(".*[a-zA-Z].*")) strength++;
        // 检查是否包含特殊字符
        if (password.matches(".*[!@#$%^&*(),.?\":{}|<>].*")) strength++;

        if (strength <= 1) return 0;
        if (strength <= 3) return 1;
        return 2;
    }

    /**
     * 获取密码强度提示
     * @param strength 强度等级
     * @return 强度提示
     */
    public static String getStrengthMessage(int strength) {
        switch (strength) {
            case 0:
                return "密码强度较弱，建议包含字母、数字和符号";
            case 1:
                return "密码强度适中";
            case 2:
                return "密码强度较强，非常安全";
            default:
                return "";
        }
    }
}